package vue;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Polygon;
import java.awt.Toolkit;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JPanel;

import controleur.ControleurPanelClasse;

import outils.PaireClasse;

import modele.ModeleClasse;
import modele.ModeleToile;
import modele.Relations;


public class VueToile extends JPanel {
	
	private static final long serialVersionUID = 1L;
	
	public static VuePanelClasse classeActuelle = null;
	
	private Vector<PaireClasse> listeRelations;
	
	private ModeleToile mt;

	
	public VueToile(ModeleToile m) 
	{
		this.mt = m;
		this.listeRelations = new Vector<PaireClasse>();
		
		//super.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		this.setBorder(BorderFactory.createLineBorder(Color.black));
		this.setLayout(null);
	}
	
	public void ajouterClasse(ModeleClasse mpc) {
		mt.ajouter(mpc);
	}
	
	public ModeleToile getModele() {
		return this.mt;
	}
	
	public Vector<PaireClasse> getListeRelations() {
		return this.listeRelations;
	}
	
	public void nouvelleRelation(PaireClasse pc) {
		this.listeRelations.addElement(pc);
	}
	
	public void enleverRelation(PaireClasse pc) {
		PaireClasse aSupprimer = new PaireClasse();
		
		for(PaireClasse tmp : this.listeRelations) {
			if(tmp.getVpc1() == pc.getVpc1() && tmp.getVpc2() == pc.getVpc2()) {
				aSupprimer = tmp;
			}
		}
		
		this.listeRelations.remove(aSupprimer);
	}
	
	public void dessinerChargement(VueFenetre f) {
		Insets insets = this.getInsets();
		
		// On parcours la liste des modéles des classes
		// puis on les redessine
		for(int i = 0 ; i < this.mt.getTaille() ; i++) { 
			/* On ajoute un panel de la classe sur la toile */
			int x = this.mt.get(i).getPositionX();
			int y = this.mt.get(i).getPositionY();
		    
			VuePanelClasse vpc = new VuePanelClasse(this.mt.get(i));
			vpc.setLocation(x,y);
			new ControleurPanelClasse(vpc, f, this);
			
			this.add(vpc, null);
			
			/* Permet d'afficher le panel à une position absolue */
	        Dimension size = vpc.getPreferredSize();
	        vpc.setBounds(x + insets.left, y + insets.top, size.width, size.height);
		}		
	}
	
	
	public void paintComponent(Graphics g) {		
		// On parcours la liste des compositions des classes
		// puis on les redessine
		for(int i = 0 ; i < this.listeRelations.size() ; i++) {
			PaireClasse pc = this.listeRelations.get(i);
			
			int x = pc.getVpc1().getX()+(pc.getVpc1().getWidth()/2);
			int y = pc.getVpc1().getY()+(pc.getVpc1().getHeight()/2);
			int x2 = pc.getVpc2().getX()+(pc.getVpc2().getWidth()/2);
			int y2 = pc.getVpc2().getY()+(pc.getVpc2().getHeight()/2);
			
			// On trace la ligne de la relartion
			g.drawLine(x, y, x2, y2);
			
			// point milieu de l'association
			int xM = (x+x2)/2;
			int yM = (y+y2)/2;
			// point milieu du coté de la classe 1
			int xM1 = (x+xM)/2;
			int yM1 = (y+yM)/2;
			
			if(pc.getTypeRelations() == Relations.ASSOCIATION) {
				// point milieu du coté de la classe 2
				int xM2 = (x2+xM)/2;
				int yM2 = (y2+yM)/2;
				
				// On dessine les cardinalités
				g.drawString(pc.getCard1(), xM1, yM1);
				g.drawString(pc.getCard2(), xM2, yM2);
			}
			else if(pc.getTypeRelations() == Relations.COMPOSITION) {
				Toolkit tk = Toolkit.getDefaultToolkit();
				Image img = tk.getImage("Images/add.png");
				//g.drawPolygon(new Polygon(xpoints, ypoints, 4));
				g.drawImage(img, xM1, yM1, null);
			}			
		}
	}

	public void setModele(ModeleToile modeleToile) {
		this.mt = modeleToile;
	}
}
